package Leetcode.ArrayAndLinkedList.moveZeroes283;

/**
 * @author 张彬彬
 * leetcode第283题给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * <p>
 * 示例:
 * <p>
 * 输入: [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 * 说明:
 * <p>
 * 必须在原数组上操作，不能拷贝额外的数组。
 * 尽量减少操作次数。
 */

/**
 * 该思路为双指针法
 * 用一个j指在零元素的位置 然后遍历这个数组
 * 遇到每次为0的数 便让j位置的数和i的下一个元素对换位置
 * 并且让兑换的位置便为0  即让0往后移动
 * 每当j值得不为0的数的时候 便让j往后移动 实现让j每次都指向一个0元素位置上
 * <p>
 * 缺点： 第一遍自己想出来的 有点繁琐  再看有点难以理解
 */

/**
 *次数 2
 */
public class Solution {
    public void moveZeroes(int[] nums) {

        System.out.print("原始数组:");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i]);
        }
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0 && i < nums.length - 1) {
                nums[j] = nums[i + 1];
                nums[i + 1] = 0;
            }
            if(nums[j] != 0){
                j++;
            }
        }


        System.out.println( "\n"+"移动后的数组");
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i]);
        }
    }


    public static void main(String[] args) {
        int[] num = {1, 0, 2, 0, 2, 3, 5};
        new Solution().moveZeroes(num);
    }
}

//
//  int j = 0;
//  for (int i = 0; i < nums.length; i++) {
//  if (nums[i] == 0) {
//  if (i < nums.length - 1) {
//  nums[j] = nums[i + 1];
//  nums[i + 1] = 0;
//  }
//  }
//  if (nums[j] != 0) {
//  j++;
//  }
//  }
//
